const express = require('express');
const app = express();

// 设置端口
const PORT = 3000;

// 样例数据
const content = `
我与父亲不相见已二年余了，我最不能忘记的是他的背影。
那年冬天，祖母死了，父亲的差使⑴也交卸了，正是祸不单行的日子。我从北京到徐州，打算跟着父亲奔丧⑵回家。到徐州见着父亲，看见满院狼藉⑶的东西，又想起祖母，不禁簌簌地流下眼泪。父亲说：“事已如此，不必难过，好在天无绝人之路！”
回家变卖典质⑷，父亲还了亏空；又借钱办了丧事。这些日子，家中光景很是惨澹⑸，一半为了丧事，一半为了父亲赋闲⑹。丧事完毕，父亲要到南京谋事，我也要回北京念书，我们便同行。
到南京时，有朋友约去游逛，勾留⑺了一日；第二日上午便须渡江到浦口，下午上车北去。父亲因为事忙，本已说定不送我，叫旅馆里一个熟识的茶房⑻陪我同去。他再三嘱咐茶房，甚是仔细。但他终于不放心，怕茶房不妥帖⑼；颇踌躇⑽了一会。其实我那年已二十岁，北京已来往过两三次，是没有什么要紧的了。他踌躇了一会，终于决定还是自己送我去。我再三劝他不必去；他只说：“不要紧，他们去不好！”
我们过了江，进了车站。我买票，他忙着照看行李。行李太多了，得向脚夫⑾行些小费才可过去。他便又忙着和他们讲价钱。我那时真是聪明过分，总觉他说话不大漂亮，非自己插嘴不可，但他终于讲定了价钱；就送我上车。他给我拣定了靠车门的一张椅子；我将他给我做的紫毛大衣铺好座位。他嘱我路上小心，夜里要警醒些，不要受凉。又嘱托茶房好好照应我。我心里暗笑他的迂；他们只认得钱，托他们只是白托！而且我这样大年纪的人，难道还不能料理自己么？我现在想想，我那时真是太聪明了。
`;

const sentences = content.split('');  // 按字拆分句子，每个字为一个单位

// 定义流式响应的接口
app.get('/api/stream-example', (req, res) => {
    // 设置响应头，指定为 EventStream 格式
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    
    // 发送事件流
    res.flushHeaders(); // 确保响应头已发送
    let messageIndex = 0;

    // 创建流式返回数据的逻辑
    const interval = setInterval(() => {
        if (messageIndex < sentences.length) {
            const contentPart = sentences[messageIndex];
            const message = {
                role: 'ASSISTANT',
                contentParts: [{
                    type: 'TEXT',
                    content: contentPart,
                }]
            };

            // 按照 Message 接口返回数据
            res.write(`data: ${JSON.stringify(message)}\n\n`);
            messageIndex++;
        } else {
            // 发送完毕后，清理定时器并结束连接
            clearInterval(interval);
            res.write('data: [DONE]\n\n');
            res.end();
        }
    }, Math.random() * 10); // 随机的时间间隔，范围为 0 到 100 毫秒

    // 错误处理
    req.on('close', () => {
        clearInterval(interval); // 客户端断开时清除定时器
    });
});

// 启动服务
app.listen(3000, '0.0.0.0', () => {
    console.log(`Server running at http://localhost:${PORT}`);
});
